import type { Color } from './types';

/**
 * Color keywords
 */
export const colorKeywords: Record<string, Color> = {
	transparent: {
		type: 'transparent',
	},

	none: {
		type: 'none',
	},

	currentcolor: {
		type: 'current',
	},
};

/**
 * Add color
 */
function add(keyword: string, colors: number[]): void {
	const type = 'rgb';
	const r = colors[0];
	const length = colors.length;
	colorKeywords[keyword] = {
		type,
		r,
		g: length > 1 ? colors[1] : r,
		b: length > 2 ? colors[2] : r,
		alpha: length > 3 ? colors[3] : 1,
	};
}

/**
 * List of base colors. From https://www.w3.org/TR/css3-color/
 */
add('silver', [192]);
add('gray', [128]);
add('white', [255]);
add('maroon', [128, 0, 0]);
add('red', [255, 0, 0]);
add('purple', [128, 0]);
add('fuchsia', [255, 0]);
add('green', [0, 128]);
add('lime', [0, 255]);
add('olive', [128, 128, 0]);
add('yellow', [255, 255, 0]);
add('navy', [0, 0, 128]);
add('blue', [0, 0, 255]);
add('teal', [0, 128, 128]);
add('aqua', [0, 255, 255]);

/**
 * List of extended colors. From https://drafts.csswg.org/css-color/
 */
add('aliceblue', [240, 248, 255]);
add('antiquewhite', [250, 235, 215]);
add('aqua', [0, 255, 255]);
add('aquamarine', [127, 255, 212]);
add('azure', [240, 255, 255]);
add('beige', [245, 245, 220]);
add('bisque', [255, 228, 196]);
add('black', [0]);
add('blanchedalmond', [255, 235, 205]);
add('blue', [0, 0, 255]);
add('blueviolet', [138, 43, 226]);
add('brown', [165, 42, 42]);
add('burlywood', [222, 184, 135]);
add('cadetblue', [95, 158, 160]);
add('chartreuse', [127, 255, 0]);
add('chocolate', [210, 105, 30]);
add('coral', [255, 127, 80]);
add('cornflowerblue', [100, 149, 237]);
add('cornsilk', [255, 248, 220]);
add('crimson', [220, 20, 60]);
add('cyan', [0, 255, 255]);
add('darkblue', [0, 0, 139]);
add('darkcyan', [0, 139, 139]);
add('darkgoldenrod', [184, 134, 11]);
add('darkgray', [169]);
add('darkgreen', [0, 100]);
add('darkgrey', [169]);
add('darkkhaki', [189, 183, 107]);
add('darkmagenta', [139, 0]);
add('darkolivegreen', [85, 107, 47]);
add('darkorange', [255, 140, 0]);
add('darkorchid', [153, 50, 204]);
add('darkred', [139, 0, 0]);
add('darksalmon', [233, 150, 122]);
add('darkseagreen', [143, 188]);
add('darkslateblue', [72, 61, 139]);
add('darkslategray', [47, 79, 79]);
add('darkslategrey', [47, 79, 79]);
add('darkturquoise', [0, 206, 209]);
add('darkviolet', [148, 0, 211]);
add('deeppink', [255, 20, 147]);
add('deepskyblue', [0, 191, 255]);
add('dimgray', [105]);
add('dimgrey', [105]);
add('dodgerblue', [30, 144, 255]);
add('firebrick', [178, 34, 34]);
add('floralwhite', [255, 250, 240]);
add('forestgreen', [34, 139]);
add('fuchsia', [255, 0]);
add('gainsboro', [220]);
add('ghostwhite', [248, 248, 255]);
add('gold', [255, 215, 0]);
add('goldenrod', [218, 165, 32]);
add('gray', [128]);
add('green', [0, 128]);
add('greenyellow', [173, 255, 47]);
add('grey', [128]);
add('honeydew', [240, 255]);
add('hotpink', [255, 105, 180]);
add('indianred', [205, 92, 92]);
add('indigo', [75, 0, 130]);
add('ivory', [255, 255, 240]);
add('khaki', [240, 230, 140]);
add('lavender', [230, 230, 250]);
add('lavenderblush', [255, 240, 245]);
add('lawngreen', [124, 252, 0]);
add('lemonchiffon', [255, 250, 205]);
add('lightblue', [173, 216, 230]);
add('lightcoral', [240, 128, 128]);
add('lightcyan', [224, 255, 255]);
add('lightgoldenrodyellow', [250, 250, 210]);
add('lightgray', [211]);
add('lightgreen', [144, 238]);
add('lightgrey', [211]);
add('lightpink', [255, 182, 193]);
add('lightsalmon', [255, 160, 122]);
add('lightseagreen', [32, 178, 170]);
add('lightskyblue', [135, 206, 250]);
add('lightslategray', [119, 136, 153]);
add('lightslategrey', [119, 136, 153]);
add('lightsteelblue', [176, 196, 222]);
add('lightyellow', [255, 255, 224]);
add('lime', [0, 255]);
add('limegreen', [50, 205]);
add('linen', [250, 240, 230]);
add('magenta', [255, 0]);
add('maroon', [128, 0, 0]);
add('mediumaquamarine', [102, 205, 170]);
add('mediumblue', [0, 0, 205]);
add('mediumorchid', [186, 85, 211]);
add('mediumpurple', [147, 112, 219]);
add('mediumseagreen', [60, 179, 113]);
add('mediumslateblue', [123, 104, 238]);
add('mediumspringgreen', [0, 250, 154]);
add('mediumturquoise', [72, 209, 204]);
add('mediumvioletred', [199, 21, 133]);
add('midnightblue', [25, 25, 112]);
add('mintcream', [245, 255, 250]);
add('mistyrose', [255, 228, 225]);
add('moccasin', [255, 228, 181]);
add('navajowhite', [255, 222, 173]);
add('navy', [0, 0, 128]);
add('oldlace', [253, 245, 230]);
add('olive', [128, 128, 0]);
add('olivedrab', [107, 142, 35]);
add('orange', [255, 165, 0]);
add('orangered', [255, 69, 0]);
add('orchid', [218, 112, 214]);
add('palegoldenrod', [238, 232, 170]);
add('palegreen', [152, 251]);
add('paleturquoise', [175, 238, 238]);
add('palevioletred', [219, 112, 147]);
add('papayawhip', [255, 239, 213]);
add('peachpuff', [255, 218, 185]);
add('peru', [205, 133, 63]);
add('pink', [255, 192, 203]);
add('plum', [221, 160]);
add('powderblue', [176, 224, 230]);
add('purple', [128, 0]);
add('rebeccapurple', [102, 51, 153]);
add('red', [255, 0, 0]);
add('rosybrown', [188, 143, 143]);
add('royalblue', [65, 105, 225]);
add('saddlebrown', [139, 69, 19]);
add('salmon', [250, 128, 114]);
add('sandybrown', [244, 164, 96]);
add('seagreen', [46, 139, 87]);
add('seashell', [255, 245, 238]);
add('sienna', [160, 82, 45]);
add('silver', [192]);
add('skyblue', [135, 206, 235]);
add('slateblue', [106, 90, 205]);
add('slategray', [112, 128, 144]);
add('slategrey', [112, 128, 144]);
add('snow', [255, 250, 250]);
add('springgreen', [0, 255, 127]);
add('steelblue', [70, 130, 180]);
add('tan', [210, 180, 140]);
add('teal', [0, 128, 128]);
add('thistle', [216, 191]);
add('tomato', [255, 99, 71]);
add('turquoise', [64, 224, 208]);
add('violet', [238, 130]);
add('wheat', [245, 222, 179]);
add('white', [255]);
add('whitesmoke', [245]);
add('yellow', [255, 255, 0]);
add('yellowgreen', [154, 205, 50]);
